//package com.bycx.framework.redis.service.impl;
//
//import com.bycx.framework.redis.AbstractRedisDao;
//import com.bycx.framework.redis.service.RedisService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.List;
//import java.util.Set;
//import java.util.concurrent.TimeUnit;
//
///**
// * RedisTemplate 封装为一个service
// * key和value的泛型都为String  序列化都是String类型
// * @author hc
// * 2017年6月20日
// */
//@Service(value = "redisService")
//public class RedisServiceImpl extends AbstractRedisDao implements RedisService{
//	@Autowired
//    private RedisTemplate<String,String> redisTemplate;
//
//   /* //设置redisTemplate
//    private void setRedisTemplate(RedisTemplate<String,String> redisTemplate) {
//        this.redisTemplate = redisTemplate;
//    }
//  */
//    public RedisTemplate<String,String> getRedisTemplate() {
//        return redisTemplate;
//    }
//
//
//	/**
//	 * 在redis里,允许模糊查询key
//		有3个通配符 *, ? ,[]
//		*: 通配任意多个字符
//		?: 通配单个字符
//		[]: 通配括号内的某1个字符
//	 */
//	public Collection<String> keys(String pattern) {
//	    return redisTemplate.keys(pattern);
//	}
//
//	/**
//	 * 单项删除 键值为key的数据
//	 */
//	public void delete(String key) {
//	    redisTemplate.delete(key);
//	}
//
//	/**
//	 * 多项删除
//	 */
//	public void delete(Collection<String> key) {
//	    redisTemplate.delete(key);
//	}
//
//	/**
//	 * 获取键值为key的数据,将数据格式化为指定类型的数据
//	 */
//	public <T> T get(String key, Class<T> clazz) {
//	    String value = redisTemplate.opsForValue().get(key);
//	    return parseJson(value, clazz);
//	}
//
//	/**
//	 * 获取多键值的数据,将集合数据格式化为指定类型的数据
//	 */
//	public <T> List<T> mget(Collection<String> keys, Class<T> clazz) {
//	    List<String> values = redisTemplate.opsForValue().multiGet(keys);
//	    return parseJsonList(values, clazz);
//	}
//
//	/**
//	 * 保存  可以设置失效时间  时间单位毫秒
//	 */
//	public <T> void set(String key, T obj, Long timeout, TimeUnit unit) {
//	    String value = toJson(obj);
//	    if (timeout != null) {
//	        redisTemplate.opsForValue().set(key, value, timeout, unit);
//	    } else {
//	        redisTemplate.opsForValue().set(key, value);
//	    }
//	}
//
//	/**
//	 * 保存  可以设置失效时间  时间单位毫秒
//	 */
//	public <T> void set(String key, T obj, Long timeout) {
//	    String value = toJson(obj);
//	    if (timeout != null) {
//	        redisTemplate.opsForValue().set(key, value, timeout);
//	    } else {
//	        redisTemplate.opsForValue().set(key, value);
//	    }
//	}
//
//	/**
//	 * redis获取并且设置值
//	 * 如果传入的value值对象为null,则只查询
//	 */
//	public <T> T getAndSet(String key, T obj, Class<T> clazz) {
//	    if (obj == null) {
//	        return get(key, clazz);
//	    }
//	    String value = redisTemplate.opsForValue().getAndSet(key, toJson(obj));
//	    return parseJson(value, clazz);
//	}
//
//	/**
//	 * redis key键值递减delta
//	 * key不要为null   key最好是能转为整数的字符串    delta为正数
//	 */
//	public int decrement(String key, int delta) {
//	    Long value = redisTemplate.opsForValue().increment(key, -delta);
//	    return value.intValue();
//	}
//
//	/**
//	 * redis key键值递增delta
//	 * key不要为null   key最好是能转为整数的字符串    delta为正数
//	 */
//	public int increment(String key, int delta) {
//	    Long value = redisTemplate.opsForValue().increment(key, delta);
//	    return value.intValue();
//	}
//
//	/**
//	 * redis 返回数据列表长度
//	 * key不要为null  key最好是能转为整数的字符串
//	 */
//	public int size(String key) {
//	    return redisTemplate.opsForList().size(key).intValue();
//	}
//
//	/**
//	 * 获取范围内数据   也称范围检索
//	 */
//	public <T> List<T> range(String key, long start, long end, Class<T> clazz) {
//	    List<String> list = redisTemplate.opsForList().range(key, start, end);
//	    return parseJsonList(list, clazz);
//	}
//
//	/**
//	 * 入队
//	 */
//	public void rightPushAll(String key, Collection<?> values, Long timeout,TimeUnit unit) {
//	    if (values == null || values.isEmpty()) {
//	        return;
//	    }
//	    redisTemplate.opsForList().rightPushAll(key, toJsonList(values));
//	    if (timeout != null) {
//	        redisTemplate.expire(key, timeout, unit);
//	    }
//	}
//
//	/**
//	 * 压栈
//	 */
//	public <T> void leftPush(String key, T obj) {
//	    if (obj == null) {
//	        return;
//	    }
//	    redisTemplate.opsForList().leftPush(key, toJson(obj));
//	}
//
//	/**
//	 * 出栈
//	 */
//	public <T> T leftPop(String key, Class<T> clazz) {
//	    String value = redisTemplate.opsForList().leftPop(key);
//	    return parseJson(value, clazz);
//	}
//
//	/**
//	 * 移除
//	 */
//	public void remove(String key, int count, Object obj) {
//	    if (obj == null) {
//	        return;
//	    }
//	    redisTemplate.opsForList().remove(key, count, toJson(obj));
//	}
//
//	/**
//	 * 返回在指定的键存储在集合中的元素的数量
//	 * 返回整数，有序集合的基数(元素的数量)，或者如果键不存在则返回0
//	 */
//	public int zcard(String key) {
//	    return redisTemplate.opsForZSet().zCard(key).intValue();
//	}
//
//	/**
//	 * 返回存储在关键的排序元素集合在指定的范围。该元素被认为是从最低到最高的分值进行排序
//	 */
//	public <T> List<T> zrange(String key, long start, long end, Class<T> clazz) {
//	    Set<String> set = redisTemplate.opsForZSet().range(key, start, end);
//	    return parseJsonList(setToList(set), clazz);
//	}
//
//	/**
//	 * 将一个或多个成员元素及其分数值加入到有序集当中
//	 */
//	public void zadd(String key, Object obj, double score) {
//	    if (obj == null) {
//	        return;
//	    }
//	    redisTemplate.opsForZSet().add(key, toJson(obj), score);
//	}
//
//	/**
//	 * 添加一个或多个成员元素
//	 */
//	public void zaddAll(String key, List<TypedTuple<?>> tupleList, Long timeout, TimeUnit unit) {
//	    if (tupleList == null || tupleList.isEmpty()) {
//	        return;
//	    }
//
//	    Set<TypedTuple<String>> tupleSet = toTupleSet(tupleList);
//	    redisTemplate.opsForZSet().add(key, tupleSet);
//	    if (timeout != null) {
//	        redisTemplate.expire(key, timeout, unit);
//	    }
//	}
//
//	/**
//	 * 移除有序集中的一个或多个成员，不存在的成员将被忽略。
//		当 key 存在但不是有序集类型时，返回一个错误
//	 */
//	public void zrem(String key, Object obj) {
//	    if (obj == null) {
//	        return;
//	    }
//	    redisTemplate.opsForZSet().remove(key, toJson(obj));
//	}
//
//	public void unionStore(String destKey, Collection<String> keys, Long timeout, TimeUnit unit) {
//	    if (keys == null || keys.isEmpty()) {
//	        return;
//	    }
//
//	    Object[] keyArr = keys.toArray();
//	    String key = (String) keyArr[0];
//
//	    Collection<String> otherKeys = new ArrayList<String>(keys.size() - 1);
//	    for (int i = 1; i < keyArr.length; i++) {
//	        otherKeys.add((String) keyArr[i]);
//	    }
//
//	    redisTemplate.opsForZSet().unionAndStore(key, otherKeys, destKey);
//	    if (timeout != null) {
//	        redisTemplate.expire(destKey, timeout, unit);
//	    }
//	}
//}
